package com.farmer.expert.service;

import com.farmer.common.entity.AgriExpert;
import com.farmer.common.result.Result;

/**
 * 农业专家服务接口
 */
public interface ExpertService {

    /**
     * 获取专家列表（分页）
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @param specialties 专业领域
     * @param availableStatus 可用状态
     * @param isVerified 是否认证
     * @param keyword 搜索关键词
     * @return 专家列表
     */
    Result<?> getExpertList(Integer pageNum, Integer pageSize, String specialties, String availableStatus, Integer isVerified, String keyword);

    /**
     * 根据ID获取专家详情
     * @param expertId 专家ID
     * @return 专家详情
     */
    Result<?> getExpertById(Long expertId);

    /**
     * 添加农业专家
     * @param expert 专家信息
     * @return 添加结果
     */
    Result<?> addExpert(AgriExpert expert);

    /**
     * 更新专家信息
     * @param expert 专家信息
     * @return 更新结果
     */
    Result<?> updateExpert(AgriExpert expert);

    /**
     * 删除专家
     * @param expertId 专家ID
     * @return 删除结果
     */
    Result<?> deleteExpert(Long expertId);

    /**
     * 更新专家状态
     * @param expertId 专家ID
     * @param status 新状态
     * @return 更新结果
     */
    Result<?> updateExpertStatus(Long expertId, Integer status);

    /**
     * 更新专家可用状态
     * @param expertId 专家ID
     * @param availableStatus 可用状态
     * @return 更新结果
     */
    Result<?> updateAvailableStatus(Long expertId, String availableStatus);

    /**
     * 专家认证
     * @param expertId 专家ID
     * @param isVerified 是否认证
     * @return 认证结果
     */
    Result<?> verifyExpert(Long expertId, Integer isVerified);

    /**
     * 获取推荐专家列表
     * @param limit 数量限制
     * @return 推荐专家列表
     */
    Result<?> getRecommendedExperts(Integer limit);

    /**
     * 根据专业领域获取专家
     * @param specialties 专业领域
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 专业领域专家列表
     */
    Result<?> getExpertsBySpecialties(String specialties, Integer pageNum, Integer pageSize);

    /**
     * 增加咨询次数
     * @param expertId 专家ID
     * @return 更新结果
     */
    Result<?> increaseConsultationCount(Long expertId);

    /**
     * 增加授课次数
     * @param expertId 专家ID
     * @return 更新结果
     */
    Result<?> increaseCourseCount(Long expertId);

    /**
     * 更新专家评分
     * @param expertId 专家ID
     * @param rating 评分
     * @return 更新结果
     */
    Result<?> updateRating(Long expertId, Double rating);

    /**
     * 获取专家统计信息
     * @return 统计信息
     */
    Result<?> getExpertStatistics();
} 